home *** CD-ROM | disk | FTP | other *** search
- (*************************************************************************
-
- $RCSfile: OCPrefs.mod $
- Description: Preferences editor for OC.
-
- Created by: fjc (Frank Copeland)
- $Revision: 1.3 $
- $Author: fjc $
- $Date: 1995/01/26 00:17:17 $
-
- Copyright © 1993-1994, Frank Copeland
- This module forms part of the OC program
- See OC.doc for conditions of use and distribution
-
- Log entries are at the end of the file.
-
- *************************************************************************)
-
- <* STANDARD- *>
-
- MODULE OCPrefs;
-
- IMPORT
- SYS := SYSTEM, Kernel, Errors, e := Exec, u := Utility, d := Dos,
- du := DosUtil, str := Strings, OCPrefsRev, OCM, s := OCPrefsStrings,
- wb := Workbench, i := Icon;
-
- CONST
-
- CopyrightStr = "Copyright © 1995 Frank Copeland\n";
-
- (* -- Command line template and parsing ------------------------------- *)
-
- CONST
-
- template =
- "FROM,SAVE/S,SEARCH/K,"
- "SYMPATH/K,OBJPATH/K,ERRPATH/K,"
- "SYMEXT/K,OBJEXT/K,ERREXT/K,"
- "VERBOSE/S,DEBUG/S,MAKEICONS/S,"
- "QUIET/S,NODEBUG/S,NOICONS/S,"
- "SET/K,CLEAR/K";
-
- template2 = "FILES/M";
-
- optFROM = 0;
- optSAVE = 1;
- optSEARCH = 2;
- optSYMPATH = 3;
- optOBJPATH = 4;
- optERRPATH = 5;
- optSYMEXT = 6;
- optOBJEXT = 7;
- optERREXT = 8;
- optVERBOSE = 9;
- optDEBUG = 10;
- optMAKEICONS = 11;
- optQUIET = 12;
- optNODEBUG = 13;
- optNOICONS = 14;
- optSET = 15;
- optCLEAR = 16;
- optCount = 17;
-
- TYPE
-
- StringArray = POINTER [2] TO ARRAY MAX(INTEGER) OF e.LSTRPTR;
-
- VAR
-
- rdArgs, rdArgs2 : d.RDArgsPtr;
- args : ARRAY optCount OF SYS.LONGWORD;
-
- (* These are filled in by ParseArgs() *)
-
- from : e.LSTRPTR;
- save : BOOLEAN;
-
- (*
- ** Lock on starting directory when run from Workbench.
- *)
-
- VAR
- startDir : d.FileLockPtr;
-
- (*
- ** Actual name that OCPrefs was run under
- *)
-
- VAR
- progName : ARRAY 256 OF CHAR;
-
- (*
- ** Console I/O
- *)
-
- (*------------------------------------*)
- PROCEDURE OutStr* ( string : ARRAY OF CHAR );
- <*$CopyArrays-*>
- BEGIN (* OutStr *)
- du.HaltIfBreak ({d.ctrlC});
- IF d.PutStr (string) = 0 THEN END;
- END OutStr;
-
-
- (*------------------------------------*)
- PROCEDURE OutChar* ( c : CHAR );
- BEGIN (* OutChar *)
- du.HaltIfBreak ({d.ctrlC});
- d.PrintF ("%lc", c)
- END OutChar;
-
-
- (*------------------------------------*)
- PROCEDURE OutLn*;
- BEGIN (* OutLn *)
- OutChar ("\n")
- END OutLn;
-
-
- (*------------------------------------*)
- PROCEDURE OutStr0* ( n : LONGINT );
- VAR string : e.LSTRPTR;
- BEGIN (* OutStr0 *)
- du.HaltIfBreak ({d.ctrlC});
- string := s.GetString (n);
- IF d.PutStr (string^) = 0 THEN END;
- END OutStr0;
-
-
- (*------------------------------------*)
- PROCEDURE OutStr1* ( n : LONGINT; string : ARRAY OF CHAR );
- VAR format : e.LSTRPTR;
- <*$CopyArrays-*>
- BEGIN (* OutStr1 *)
- du.HaltIfBreak ({d.ctrlC});
- format := s.GetString (n);
- d.PrintF (format^, SYS.ADR (string));
- END OutStr1;
-
-
- (*------------------------------------*)
- PROCEDURE OutBool* ( b : BOOLEAN );
- BEGIN (* OutBool *)
- IF b THEN OutStr ("TRUE")
- ELSE OutStr ("FALSE")
- END
- END OutBool;
-
-
- (*------------------------------------*)
- PROCEDURE* Cleanup (VAR rc : LONGINT);
-
- VAR oldDir : d.FileLockPtr;
-
- BEGIN (* Cleanup *)
- IF rdArgs # NIL THEN
- d.FreeArgs (rdArgs);
- d.FreeDosObject (d.rdArgs, rdArgs);
- rdArgs := NIL
- END;
- IF rdArgs2 # NIL THEN
- d.FreeDosObject (d.rdArgs, rdArgs2);
- rdArgs2 := NIL
- END;
- s.CloseCatalog();
- IF Kernel.fromWorkbench THEN oldDir := d.CurrentDir (startDir) END
- END Cleanup;
-
- (*------------------------------------*)
- PROCEDURE Init ();
-
- BEGIN (* Init *)
- Kernel.SetCleanup (Cleanup);
- s.OpenCatalog (NIL, "");
-
- rdArgs := d.AllocDosObjectTags (d.rdArgs, u.end);
- rdArgs2 := d.AllocDosObjectTags (d.rdArgs, u.end);
- IF (rdArgs = NIL) OR (rdArgs2 = NIL) THEN
- OutStr0 (s.msg15); HALT (d.warn)
- END;
-
- args [optFROM] := NIL;
- args [optSAVE] := FALSE;
- args [optSEARCH] := NIL;
- args [optSYMPATH] := NIL;
- args [optOBJPATH] := NIL;
- args [optERRPATH] := NIL;
- args [optSYMEXT] := NIL;
- args [optOBJEXT] := NIL;
- args [optERREXT] := NIL;
- args [optVERBOSE] := FALSE;
- args [optDEBUG] := FALSE;
- args [optMAKEICONS] := FALSE;
- args [optQUIET] := FALSE;
- args [optNODEBUG] := FALSE;
- args [optNOICONS] := FALSE;
- args [optSET] := NIL;
- args [optCLEAR] := NIL;
- END Init;
-
- (*------------------------------------*)
- PROCEDURE CloneStr ( oldStr : e.LSTRPTR ) : e.LSTRPTR;
- VAR newStr : e.LSTRPTR;
- BEGIN (* CloneStr *)
- SYS.NEW (newStr, str.Length (oldStr^) + 1);
- COPY (oldStr^, newStr^);
- RETURN newStr
- END CloneStr;
-
- (*------------------------------------*)
- PROCEDURE ParseArgs ();
-
- VAR
- string : e.LSTRPTR; strings : StringArray;
- i : INTEGER; ignore : BOOLEAN; ch : CHAR;
- args2 : ARRAY 1 OF SYS.LONGWORD;
- verbose, quiet, debug, nodebug, makeicons, noicons : BOOLEAN;
-
- (*------------------------------------*)
- PROCEDURE ParseString (s, msg : ARRAY OF CHAR);
-
- VAR len : LONGINT; buffer : e.LSTRPTR;
-
- <*$CopyArrays-*>
- BEGIN (* ParseString *)
- len := str.Length (s) + 2;
- SYS.NEW (buffer, len);
- COPY (s, buffer^);
- buffer [len-2] := "\n"; buffer [len-1] := 0X;
- rdArgs2.source.buffer := buffer;
- rdArgs2.source.length := len - 1;
- rdArgs2.source.curChr := 0;
- rdArgs2.daList := 0; rdArgs2.buffer := NIL; rdArgs2.bufSiz := 0;
- rdArgs2.extHelp := NIL; rdArgs2.flags := {};
- args2 [0] := NIL;
- IF d.OldReadArgs (template2, args2, rdArgs2) = NIL THEN
- ignore := d.PrintFault (d.IoErr(), msg);
- HALT (d.warn)
- END
- END ParseString;
-
- BEGIN (* ParseArgs *)
- from := SYS.VAL (e.LSTRPTR, args [optFROM]);
- IF from = NIL THEN ignore := OCM.LoadPrefs ("OC.prefs")
- ELSE ignore := OCM.LoadPrefs (from^)
- END;
-
- save := (SYS.VAL (LONGINT, args [optSAVE]) # 0);
-
- string := SYS.VAL (e.LSTRPTR, args [optSEARCH]);
- IF string # NIL THEN
- OCM.ClearSearchPaths();
- ParseString (string^, " !! SYM");
- strings := SYS.VAL (StringArray, args2 [0]);
- IF strings # NIL THEN
- i := 0;
- WHILE strings [i] # NIL DO
- string := strings [i];
- OCM.AddSearchPath (CloneStr (string));
- INC (i)
- END;
- END;
- d.FreeArgs (rdArgs2)
- END;
-
- string := SYS.VAL (e.LSTRPTR, args [optSYMPATH]);
- IF string # NIL THEN COPY (string^, OCM.SymPath) END;
- string := SYS.VAL (e.LSTRPTR, args [optOBJPATH]);
- IF string # NIL THEN COPY (string^, OCM.ObjPath) END;
- string := SYS.VAL (e.LSTRPTR, args [optERRPATH]);
- IF string # NIL THEN COPY (string^, OCM.ErrPath) END;
-
- string := SYS.VAL (e.LSTRPTR, args [optSYMEXT]);
- IF string # NIL THEN COPY (string^, OCM.SymExt) END;
- string := SYS.VAL (e.LSTRPTR, args [optOBJEXT]);
- IF string # NIL THEN COPY (string^, OCM.ObjExt) END;
- string := SYS.VAL (e.LSTRPTR, args [optERREXT]);
- IF string # NIL THEN COPY (string^, OCM.ErrExt) END;
-
- verbose := (SYS.VAL (LONGINT, args [optVERBOSE]) # 0);
- quiet := (SYS.VAL (LONGINT, args [optQUIET]) # 0);
- IF verbose & quiet THEN
- OutStr0 (s.msg5);
- HALT (d.warn)
- ELSIF verbose THEN OCM.Verbose := TRUE
- ELSIF quiet THEN OCM.Verbose := FALSE
- END;
-
- debug := (SYS.VAL (LONGINT, args [optDEBUG]) # 0);
- nodebug := (SYS.VAL (LONGINT, args [optNODEBUG]) # 0);
- IF debug & nodebug THEN
- OutStr0 (s.msg6);
- HALT (d.warn)
- ELSIF debug THEN OCM.Debug := TRUE
- ELSIF nodebug THEN OCM.Debug := FALSE
- END;
-
- makeicons := (SYS.VAL (LONGINT, args [optMAKEICONS]) # 0);
- noicons := (SYS.VAL (LONGINT, args [optNOICONS]) # 0);
- IF makeicons & noicons THEN
- OutStr0 (s.msg7);
- HALT (d.warn)
- ELSIF makeicons THEN OCM.MakeIcons := TRUE
- ELSIF noicons THEN OCM.MakeIcons := FALSE
- END;
-
- string := SYS.VAL (e.LSTRPTR, args [optSET]);
- IF string # NIL THEN COPY (string^, OCM.SetNames) END;
- string := SYS.VAL (e.LSTRPTR, args [optCLEAR]);
- IF string # NIL THEN COPY (string^, OCM.ClearNames) END;
- END ParseArgs;
-
- (*------------------------------------*)
- PROCEDURE Main ();
-
- (*------------------------------------*)
- PROCEDURE WbArgs ();
-
- VAR
- wbStartup : wb.WBStartupPtr;
- wbArg : wb.WBArg;
- diskObj : wb.DiskObjectPtr;
- toolTypes : wb.ToolTypePtr;
- string : e.LSTRPTR;
-
- BEGIN (* WbArgs *)
- wbStartup := SYS.VAL (wb.WBStartupPtr, Kernel.WBenchMsg);
- IF wbStartup.numArgs > 2 THEN OutStr0 (s.msg14); HALT (d.warn) END;
-
- COPY (wbStartup.argList [0].name^, progName);
- wbArg := wbStartup.argList [wbStartup.numArgs-1];
- startDir := d.CurrentDir (wbArg.lock);
-
- IF i.base # NIL THEN
- (* Attempt to load the icon *)
- diskObj := i.GetDiskObject (wbArg.name^);
- IF diskObj # NIL THEN
- toolTypes := diskObj.toolTypes;
- string := i.FindToolType (toolTypes, "FROM");
- IF string # NIL THEN args [optFROM] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "SAVE");
- IF string # NIL THEN args [optSAVE] := TRUE END;
- string := i.FindToolType (toolTypes, "SEARCH");
- IF string # NIL THEN args [optSEARCH] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "SYMPATH");
- IF string # NIL THEN args [optSYMPATH] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "OBJPATH");
- IF string # NIL THEN args [optOBJPATH] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "ERRPATH");
- IF string # NIL THEN args [optERRPATH] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "SYMEXT");
- IF string # NIL THEN args [optSYMEXT] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "OBJEXT");
- IF string # NIL THEN args [optOBJEXT] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "ERREXT");
- IF string # NIL THEN args [optERREXT] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "VERBOSE");
- IF string # NIL THEN args [optVERBOSE] := TRUE END;
- string := i.FindToolType (toolTypes, "QUIET");
- IF string # NIL THEN args [optQUIET] := TRUE END;
- string := i.FindToolType (toolTypes, "DEBUG");
- IF string # NIL THEN args [optDEBUG] := TRUE END;
- string := i.FindToolType (toolTypes, "NODEBUG");
- IF string # NIL THEN args [optNODEBUG] := TRUE END;
- string := i.FindToolType (toolTypes, "MAKEICONS");
- IF string # NIL THEN args [optMAKEICONS] := TRUE END;
- string := i.FindToolType (toolTypes, "NOICONS");
- IF string # NIL THEN args [optNOICONS] := TRUE END;
- string := i.FindToolType (toolTypes, "SET");
- IF string # NIL THEN args [optSET] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "CLEAR");
- IF string # NIL THEN args [optCLEAR] := CloneStr (string) END;
-
- i.FreeDiskObject (diskObj)
- END
- END;
-
- IF (SYS.VAL (LONGINT, args [optFROM]) = 0) & (wbStartup.numArgs = 2)
- THEN
- args [optFROM] := wbArg.name
- END
- END WbArgs;
-
- (*------------------------------------*)
- PROCEDURE CliArgs ();
- VAR ignore : BOOLEAN;
- BEGIN (* CliArgs *)
- ASSERT (d.GetProgramName (progName, LEN (progName)));
- IF d.OldReadArgs (template, args, rdArgs) = NIL THEN
- ignore := d.PrintFault (d.IoErr(), "");
- HALT (d.warn)
- END
- END CliArgs;
-
- (*------------------------------------*)
- PROCEDURE PrintPrefs;
- VAR i : INTEGER;
- BEGIN (* PrintPrefs *)
- OutStr0 (s.msg8);
- IF from = NIL THEN OutStr ("OC.prefs")
- ELSE OutStr (from^)
- END;
- OutLn; OutLn;
- OutStr0 (s.msg9);
- IF OCM.pathx = 0 THEN
- OutStr0 (s.msg10)
- ELSE
- FOR i := 0 TO OCM.pathx - 1 DO
- OutChar (" "); OutStr (OCM.searchPath [i]^);
- END
- END;
- OutLn;
- OutStr ("SymPath ........: "); OutStr (OCM.SymPath); OutLn;
- OutStr ("ObjPath ........: "); OutStr (OCM.ObjPath); OutLn;
- OutStr ("ErrPath ........: "); OutStr (OCM.ErrPath); OutLn;
- OutStr ("SymExt .........: "); OutStr (OCM.SymExt); OutLn;
- OutStr ("ObjExt .........: "); OutStr (OCM.ObjExt); OutLn;
- OutStr ("ErrExt .........: "); OutStr (OCM.ErrExt); OutLn;
- OutStr ("Verbose ........: "); OutBool (OCM.Verbose); OutLn;
- OutStr ("Debug ..........: "); OutBool (OCM.Debug); OutLn;
- OutStr ("MakeIcons ......: "); OutBool (OCM.MakeIcons); OutLn;
- OutStr ("Set ............: "); OutStr (OCM.SetNames); OutLn;
- OutStr ("Clear ..........: "); OutStr (OCM.ClearNames); OutLn;
- OutLn;
- END PrintPrefs;
-
- (*------------------------------------*)
- PROCEDURE MakeIcon ( file : ARRAY OF CHAR );
-
- CONST defPrefsIcon = "def_prefs";
-
- VAR
- icon : ARRAY 256 OF CHAR;
- diskObj : wb.DiskObjectPtr;
- oldTool : e.LSTRPTR;
-
- <*$CopyArrays-*>
- BEGIN (* MakeIcon *)
- ASSERT (i.base # NIL, 100);
- COPY (file, icon); str.Append (".info", icon);
- IF ~du.FileExists (icon) THEN
- diskObj := i.GetDiskObject ("ENV:OCPrefs/def_prefs");
- IF diskObj = NIL THEN diskObj := i.GetDefDiskObject (wb.project) END;
- IF diskObj # NIL THEN
- oldTool := diskObj.defaultTool;
- diskObj.defaultTool := SYS.ADR (progName);
- diskObj.currentX := wb.noIconPosition;
- diskObj.currentY := wb.noIconPosition;
- IF ~i.PutDiskObject (file, diskObj) THEN
- IF d.PrintFault (d.IoErr(), "PutDiskObject") THEN END;
- OutStr1 (s.msg16, icon)
- END;
- diskObj.defaultTool := oldTool;
- i.FreeDiskObject (diskObj)
- ELSE
- IF d.PrintFault (d.IoErr(), "GetDiskObject") THEN END;
- OutStr0 (s.msg17)
- END
- END
- END MakeIcon;
-
- BEGIN (* Main *)
- OutStr (OCPrefsRev.vString);
- OutStr (CopyrightStr);
- OutStr0 (s.msg13);
- OutLn;
-
- IF Kernel.fromWorkbench THEN WbArgs()
- ELSE CliArgs()
- END;
- ParseArgs();
- PrintPrefs();
- IF save THEN
- IF from = NIL THEN
- IF OCM.SavePrefs ("OC.prefs") THEN OutStr1 (s.msg11, "OC.prefs")
- ELSE OutStr1 (s.msg12, "OC.prefs")
- END;
- IF Kernel.fromWorkbench THEN MakeIcon ("OC.prefs") END
- ELSE
- IF OCM.SavePrefs (from^) THEN OutStr1 (s.msg11, from^)
- ELSE OutStr1 (s.msg12, from^)
- END;
- IF Kernel.fromWorkbench THEN MakeIcon (from^) END
- END
- END;
- END Main;
-
- BEGIN (* OCPrefs *)
- ASSERT (e.SysBase.libNode.version >= 37);
- Errors.Init;
-
- Init();
- Main()
- END OCPrefs.
-
- (***************************************************************************
-
- $Log: OCPrefs.mod $
- # Revision 1.3 1995/01/26 00:17:17 fjc
- # - Release 1.5
- #
- # Revision 1.2 1995/01/09 14:08:13 fjc
- # - Removed command line arguments for icon names.
- # - No longer checks for the existence of directories when
- # parsing the command line.
- # - Added MakeIcon() to create icons for preferences files.
- # - Implemented Workbench arguments.
- #
- # Revision 1.1 1995/01/05 13:28:53 fjc
- # Initial revision
- #
- ***************************************************************************)
-